#include <iostream>

#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

#include <vector>
#include <string>
#include <cstring>
#include <cstdlib>

// void *newthreadrun(void *args)
// {
//     while (true)
//     {
//         std::cout << "I am new thread,pid" << getpid() << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, newthreadrun, nullptr);
//     while (true)
//     {
//         std::cout << "I am main thread,pid" << getpid() << std::endl;
//         sleep(1);
//     }
// }

//--------------------------------------------------

// const int threadnum = 5;
// class Task
// {
// public:
//     Task()
//     {
//     }
//     void SetData(int x, int y)
//     {
//         datax = x;
//         datay = y;
//     }
//     int Excute()
//     {
//         return datax + datay;
//     }
//     ~Task()
//     {
//     }

// private:
//     int datax;
//     int datay;
// };

// class ThreadData : public Task
// {
// public:
//     ThreadData(int x, int y, const std::string &threadname) : _threadname(threadname)
//     {
//         _t.SetData(x, y);
//     }
//     std::string threadname()
//     {
//         return _threadname;
//     }
//     int run()
//     {
//         return _t.Excute();
//     }

// private:
//     std::string _threadname;
//     Task _t;
// };
// class Result
// {
// public:
//     Result()
//     {
//     }
//     ~Result()
//     {
//     }
//     void SetResult(int result, const std::string &threadname)
//     {
//         _result = result;
//         _threadname = threadname;
//     }
//     void Print()
//     {
//         std::cout << "Thread name: " << _threadname << ", Result: " << _result << std::endl;
//     }

// private:
//     int _result;
//     std::string _threadname;
// };
// void *handlerTask(void *args)
// {
//     ThreadData *td = static_cast<ThreadData *>(args);
//     std::string name = td->threadname();
//     Result *res = new Result();
//     int result = td->run();
//     res->SetResult(result, name);
//     delete td;
//     sleep(2);
//     return res;
// }
// int main()
// {
//     std::vector<pthread_t> threads;
//     for (int i = 0; i < threadnum; i++)
//     {
//         char threadname[64];
//         snprintf(threadname, 64, "Thread-%d", i + 1);
//         ThreadData *td = new ThreadData(10, 20, threadname);
//         pthread_t tid;
//         pthread_create(&tid, nullptr, handlerTask, td);
//         threads.push_back(tid);
//     }
//     std::vector<Result *> result_set;
//     void *ret = nullptr;
//     for (auto &tid : threads)
//     {
//         pthread_join(tid, &ret);
//         result_set.push_back((Result *)ret);
//     }
//     for (auto &res : result_set)
//     {
//         res->Print();
//         delete res;
//     }
// }

//______________________________________________________________________________________

// // 线程终止
// // 将 pthread_t 转成 0x... 的十六进制字符串
// std::string Token(pthread_t tid)
// {
//     char id[64]; // 注意这里要有分号
//     // 把 tid 当作 unsigned long，用 "%lx" 以十六进制形式打印
//     // "0x%lx" 就是输出 “0x” 前缀，后面跟一个十六进制数（小写字母）
//     std::snprintf(id, sizeof(id), "0x%lx", (unsigned long)tid);
//     return id;
// }
// void *threadrun(void *args)
// {
//     std::string threadname = (char *)args;
//     int cnt = 5;
//     while (cnt)
//     {
//         std::cout << threadname << " is running, " << cnt << " ；pid：  " << getpid() << " ;mythread id: " << Token(pthread_self()) << std::endl;
//         sleep(1);
//         cnt--;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void *)"thread-1");
//     pthread_join(tid, nullptr);
//     std::cout << " main: thread exit " << std::endl;
//     return 0;
// }